# 导入模块

import pygame
# 常量
from pygame.locals import *
# 时间
import time,random,os



class HeroPlane:
    '''玩家飞机'''
    def __init__(self,screen_temp): #添加窗口对象
        self.x = 200
        self.y = 400
        self.screen = screen_temp
        self.image = pygame.image.load("./images/me.png")
        self.bullet_list = [] #玩家子弹列表，存放子弹

    def display(self):
        '''绘制玩家飞机'''

        #绘制子弹
        for b in self.bullet_list:
            b.display()
            if b.move():
                self.bullet_list.remove(b)
        self.screen.blit(self.image,(self.x,self.y))
  
    def move_left(self):
        '''左移动'''
        self.x -= 5
        if self.x <= 0:
            self.x = 0
            
    def move_right(self):
        '''右移动'''
        self.x += 5
        if self.x >= 406:
            self.x = 406

    def fire(self):
        '''发射子弹'''
        self.bullet_list.append(Bullet(self.screen,self.x,self.y))
        print(len(self.bullet_list))
    
        

class Bullet:
    '''子弹'''
    def __init__(self,screen_temp,x,y): #添加窗口对象
        self.x = x + 53
        self.y = y
        self.screen = screen_temp
        self.image = pygame.image.load("./images/pd.png")
        

    def display(self):
        '''绘制子弹'''
        self.screen.blit(self.image,(self.x,self.y))
        
    #玩家子弹
    def move(self):
        self.y -= 10
        if self.y <= -20:
            return True
    #敌机子弹
    def move2(self):
        self.y += 6
        if self.y >= 600:
            return True
       

class EnemyPlane:
    '''敌机类'''
    def __init__(self,screen_temp): #添加窗口对象
        self.x = random.choice(range(0,408))
        self.y = -75
        self.screen = screen_temp
        self.image = pygame.image.load("./images/e"+str(random.choice(range(3)))+".png")
        self.bullet_list2 = [] #敌机子弹列表，存放子弹

    def display(self):

        #绘制子弹
        for b in self.bullet_list2:
            b.display()
            if b.move2():
                self.bullet_list2.remove(b)
                
        '''绘制敌机'''
        self.screen.blit(self.image,(self.x,self.y))


    def move(self,hero):
        '''敌机移动'''
        self.y += 4
        
        #敌机出屏幕
        if self.y >= 568:
            return True
        
        '''遍历玩家飞机的所有子弹,并执行碰撞'''
        for bo in hero.bullet_list: 
            if bo.x > self.x+12 and bo.x < self.x+92 and bo.y > self.y+20 and bo.y < self.y+60:
                hero.bullet_list.remove(bo)
                return True
        #遍历敌机子弹，执行与玩家飞机碰撞
        for em in self.bullet_list2:
            if em.x > hero.x+12 and em.x < hero.x+92 and em.y > hero.y+20 and em.y < hero.y+50:
                print("击中……")
                exit()

    def blast(self):
        '''敌机爆炸'''
        
        #self.image = pygame.image.load("./images/bz"+str(random.choice(range(1,4)))+".png")
        self.image = pygame.image.load("./images/bz"+str(random.choice(range(1,4)))+".png")      
        self.screen.blit(self.image,(self.x,self.y))
        print("====",self.image)
        
                
        
    #敌机发射子弹
    def fire2(self):
        random_num = random.choice(range(1,60))
        if random_num == 10 or random_num ==20:
            self.bullet_list2.append(Bullet(self.screen,self.x-5,self.y+30))
            print(len(self.bullet_list2))
        
       

def key_control(hero_temp): #获取飞机参数

    '''键盘控制函数'''

    #执行程序退出操作
    for event in pygame.event.get():#获取按键所有信息
        if event.type == QUIT:
            print("exit()")
            exit()
            
        
    #获取按键信息
    pressed_keys = pygame.key.get_pressed()
    #print("pressed_keys")

    #做判断，并执行对象的操作
    if pressed_keys[K_LEFT] or pressed_keys[K_a]:
        print("Left..")
        hero_temp.move_left()
        
    elif pressed_keys[K_RIGHT] or pressed_keys[K_d]:
        print("Right..")
        hero_temp.move_right()

    if pressed_keys[K_SPACE]:
        print("Space...")
        hero_temp.fire()

def main():

    '''主程序函数'''
    
    # 创建游戏窗口,返回一个对象
    screen = pygame.display.set_mode((512,568),0,0)

    #创建一个游戏背景
    background = pygame.image.load("./images/bg2.jpg")

    #创建玩家飞机
    hero = HeroPlane(screen) #传入窗口对象
    

    m = -968 #定义一个初值 ,滚动画面
    enemylist = [] #存放敌机列表
    while True:
        
        #绘制画面
        screen.blit(background,(0,m))
        m += 2
        if m >= -200:
            m = -968 #改回初值 ，无缝滚动

        #绘制玩家飞机
        hero.display()

        #执行键盘控制,触发飞机
        key_control(hero)

        #随机绘制敌机
        if random.choice(range(80)) == 10:
            enemylist.append(EnemyPlane(screen))
        #遍历敌机并绘制
        for em in enemylist:
            em.display() #显示
            em.fire2()
            #print("---",em.fire2())
            if em.move(hero): #移出
                enemylist.remove(em)
                em.blast()
        
        #更新显示
        pygame.display.update()

        #定时显示,每隔0.04显示一次
        time.sleep(0.04)


# 调用主程序,判断当前是否是主程序
if __name__ == "__main__":
    main()
